Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 vector-feature-night-mode-enabled skin-theme-clientpref-os vector-sticky-header-enabled" lang="fr" dir="ltr"><head>
<meta charset="UTF-8">
<title>Spécification de JavaScript</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://fr.wikipedia.org/wiki/Sp%C3%A9cification_de_JavaScript"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Spécification_de_JavaScript rootpage-Spécification_de_JavaScript skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Spécification de JavaScript</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="fr" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="fr" dir="ltr"><p>La spécification d'un langage est une définition de la syntaxe et de la sémantique du langage. Cette définition est en général un ensemble de règles syntaxiques définies dans une grammaire.
</p><p>Initialement dédiés au partage de contenus statiques sur Internet, les sites web sont devenus de véritables applications accessibles à partir de n'importe quel navigateur.
</p><p>Afin de rendre les sites plus interactifs et dynamiques, il a été nécessaire de mettre en place des langages de script tel que l'<a href="ActionScript" title="ActionScript">ActionScript</a> ou le <a href="JavaScript" title="JavaScript">JavaScript</a>. Ce dernier est actuellement le langage le plus utilisé pour les applications côté client, c'est-à-dire sur le navigateur.
</p><p>L'<a href="ECMAScript" title="ECMAScript">ECMAScript</a> a vu le jour en 1997 dans le but d'uniformiser l'interprétation de ces différents <a href="Langage_de_script" title="Langage de script">langages de script</a>. Cette spécification décrit la syntaxe et la sémantique que ces langages doivent respecter, sous forme de phrases littérales. Ces définitions étant sujettes a interprétation, on a vu apparaître des divergences d'un langage, ou d'une de ses implémentations, à l'autre. La formalisation de cette spécification EcmaScript permettrait de lisser ces différences d'interprétation.
</p>

<div class="mw-heading mw-heading2"><h2 id="Motivations">Motivations</h2></div>
<p>La norme ECMAscript ne décrit pas le comportement à adopter par JavaScript de façon précise du fait que les règles sont définies avec des phrases littérales. En effet, chaque description de la spécification peut être comprise et interprétée différemment, ce qui a mené à l'apparition de divers interpréteurs JavaScript, ou même encore de primitives spécifiques aux <a href="Moteur_de_rendu_HTML" class="mw-redirect" title="Moteur de rendu HTML">moteurs</a> de certains navigateurs, notamment entre <a href="Internet_Explorer" title="Internet Explorer">Internet Explorer</a> et <a href="Mozilla_Firefox" title="Mozilla Firefox">Mozilla Firefox</a><sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>.
Cette différence d'interprétation entre Internet Explorer et les autres navigateurs provient du fait que lors de la création du JavaScript par <a href="Brendan_Eich" title="Brendan Eich">Brendan Eich</a> en 1995, <a href="Microsoft" title="Microsoft">Microsoft</a> a développé sa propre version<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> avant que la norme EcmaScript apparaisse.
Ceci est la raison pour laquelle un script fonctionnant correctement sous Internet Explorer ne fonctionnera pas forcément sur un autre navigateur. Dans le but d'assurer une compatibilité optimale entre les différents navigateurs, il est nécessaire de définir une spécification formelle afin que tous les interpréteurs acceptent la même syntaxe.
</p><p>De plus, le <a href="JavaScript" title="JavaScript">JavaScript</a> possède des vulnérabilités, quant au bon déroulement d'un programme, dues à certains cas non décrits dans la norme <a href="ECMAScript" title="ECMAScript">ECMAScript</a>. Prenons par exemple le cas de l'opérateur <code>typeof</code>&nbsp;: la norme ne décrit pas explicitement quel comportement adopter si l'évaluation de l'expression unitaire provoque une erreur, laissant la possibilité ici d'un comportement variable selon les implémentations<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup>. Il est ainsi nécessaire aux analyseurs de gérer ce genre de problèmes. Les différentes interprétations n'assurent donc pas un comportement uniforme des programmes JavaScript, c'est pourquoi plusieurs recherches se portent sur la formalisation de ce langage.
</p>
<div class="mw-heading mw-heading2"><h2 id="Approches">Approches</h2></div>
<p>On relève dans la <a href="Communaut%C3%A9_scientifique" title="Communauté scientifique">communauté scientifique</a> au moins 3 approches sur cette question.
</p>
<div class="mw-heading mw-heading3"><h3 id="λJS[4]_:_l'essence_de_JavaScript[5]"><span id=".CE.BBJS.5B4.5D_:_l.27essence_de_JavaScript.5B5.5D"></span>λJS<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>&nbsp;: l'essence de JavaScript<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup></h3></div>
<p>Cette approche part de deux constats&nbsp;: d'une part, le JavaScript n'est pas sécurisé à cause d'une sémantique non conventionnelle&nbsp;; d'autre part, le langage est trop complexe pour être testé par des outils de tests standard. C'est sur ces deux points que se sont portés les travaux de Arjun Guha, Claudiu Saftoiu et Shriram Krishnamurthi.
</p><p>Leur premier travail a été de concevoir un noyau, nommé λJS, qui ne contient que les fonctions essentielles du langage, sorte de sous-ensemble complet de JavaScript. Bien sûr, le fait de ne garder que l'essence du langage fait que beaucoup de <a href="Sucre_syntaxique" title="Sucre syntaxique">sucre syntaxique</a> n'existe plus. Prenons, par exemple, l'<a href="Mise_en_%C5%93uvre" title="Mise en œuvre">implémentation</a> des objets, où certaines syntaxes ont été supprimées, au privilège d'une seule lorsque plusieurs sont envisageables. Afin d'accéder à l'attribut <code>x</code> d'un objet <code>Y</code>, il est normalement possible d'écrire <code>Y['x']</code> ou <code>Y.x</code>. Cependant, λJS ne possède que l'écriture <code>Y['x']</code> et n'implémente pas d'écriture alternative afin de garder le noyau de langage le plus petit possible. Une autre modification majeure est la disparation de l'utilisation implicite du <code>this</code>. En effet, lorsque l'on utilise le mot clé <code>this</code>, le programme fait référence à l'objet sur lequel est appelée la fonction. Toutefois, ce paramètre est implicite, il n'est donc pas nécessaire de le renseigner lors de l'appel de la méthode d'un objet, ce qui n'est pas le cas avec λJS. Ils ont ainsi fait disparaître un grand nombre de <a href="Sucre_syntaxique" title="Sucre syntaxique">sucres syntaxiques</a> dans le but de minimiser l'implémentation des fonctions pour permettre plus facilement la vérification d'un programme.
</p><p>Cependant, afin de faire accepter leur noyau par les autres développeurs, il est nécessaire pour eux de prouver que n'importe quel programme écrit en JavaScript peut être réduit en un programme basé sur λJS. Pour réaliser leurs tests, l'équipe s'est basée sur trois implémentations de Javascript&nbsp;: <a href="SpiderMonkey" title="SpiderMonkey">SpiderMonkey</a> (Firefox), <a href="V8_(moteur_JavaScript)" title="V8 (moteur JavaScript)">V8</a> (Chrome), et <a href="Rhino_(moteur_JavaScript)" title="Rhino (moteur JavaScript)">Rhino</a> (implémentation en Java). Ils ont transformé différents programmes compatibles sur ces implémentations vers un programme λJS, et ont ensuite vérifié que la sortie du nouveau programme correspond à celle de la version d'origine. Afin de couvrir un maximum de cas, les programmes sont un échantillon important de la série de test JavaScript de Mozilla<sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup>. Les tests ont été concluants&nbsp;: l'intégralité de la série de tests produit exactement le même résultat que les trois autres implémentations.
</p><p>L'objectif final étant de fournir un langage sûr, il est nécessaire de fournir un outil permettant de vérifier ce résultat. Le λJS étant une implémentation simplifiée du JavaScript, et étant donné qu'un programme peut être réduit en λJS, il est nécessaire de montrer que λJS est sûr. Pour prouver ceci, ils ont décomposé chaque propriété en sous-problèmes. Pour illustrer, prenons le cas de l'addition&nbsp;: ils jugent qu'une addition <code>e1 + e2</code> est sûre si les expressions <code>e1</code> et <code>e2</code> sont sûres. En posant plusieurs <a href="Lemme_(linguistique)" title="Lemme (linguistique)">lemmes</a>, ils démontrent que l'addition est sûre et qu'elle peut être incluse dans le λJS. En appliquant cette démarche sur plusieurs éléments du langage, ils ont réussi à inclure un grand nombre de fonctionnalités à leur noyau en le gardant sûr. Ceci a permis en 2012 de définir le λJS comme base pour le langage JavaScript par ECMAScript 6<sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup>, toutefois cette version n'est pas encore totalement supportée par tous les navigateurs<sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup>.
</p>
<div class="mw-heading mw-heading3"><h3 id="SAFE_:_une_autre_specification_pour_EcmaScript[9]"><span id="SAFE_:_une_autre_specification_pour_EcmaScript.5B9.5D"></span>SAFE&nbsp;: une autre specification pour EcmaScript<sup id="cite_ref-9" class="reference"><a href="#cite_note-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup></h3></div>
<p>SAFE<sup id="cite_ref-10" class="reference"><a href="#cite_note-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup> (Scalable <a href="Framework" title="Framework">Framework</a> Analysis for ECMAScript) est un projet mené par le groupe de recherche en <a href="Langage_de_programmation" title="Langage de programmation">langage de programmation</a> de l'Institut supérieur coréen des sciences et technologies (<a href="KAIST" title="KAIST">KAIST</a>).
</p><p>Tout comme le papier précédent, l'équipe se penche ici sur le constat que la spécification informelle du langage rend celui-ci sujet à interprétation. L'équipe relève également que les différents moteurs Javascript ne sont pas assez documentés, rendant leur compréhension et leur modification difficile. Ceci était le cas avec λJS qu'ils ont souhaité utiliser&nbsp;: ils ont jugé que la documentation concernant la réduction du Javascript en leur noyau n'était pas assez détaillée. C'est en partant de ces deux propositions qu'ils ont débuté le projet SAFE qui a pour but d'améliorer l'analyse d'un programme Javascript ainsi que de fournir un outil documenté pour la recherche.
</p><p>SAFE est développé à destination de la communauté de recherche en JavaScript, c'est un projet <a href="Open_source" title="Open source">open-source</a> dont le code est accessible en ligne<sup id="cite_ref-11" class="reference"><a href="#cite_note-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup>. L'implémentation est réalisée en <a href="Java_(technique)" title="Java (technique)">Java</a> et en <a href="Scala_(langage)" title="Scala (langage)">Scala</a>.
</p><p>Comparé à l'approche de λJS, l'équipe ne s'est pas contentée de réduire un maximum de langage afin de fournir une spécification simplifiée mais a préféré réaliser une spécification de l'ensemble du langage. C'est dans ce sens qu'ils ont défini une spécification sur chaque niveau de représentation d'un programme Javascript.
</p>
<div class="mw-heading mw-heading4"><h4 id="L'arbre_de_syntaxe_abstrait_:_AST"><span id="L.27arbre_de_syntaxe_abstrait_:_AST"></span>L'arbre de syntaxe abstrait&nbsp;: AST</h4></div>
<p>Afin de réaliser leur framework, il a été dans un premier temps nécessaire de transformer le code Javascript en un code facilement analysable.
</p><p>Pour ce faire, le framework se base sur 3 niveaux de représentation d'un programme Javascript. La première représentation (qui est la plus proche du <a href="Code_source" title="Code source">code source</a>) est un AST (<a href="Arbre_syntaxique_abstrait" class="mw-redirect" title="Arbre syntaxique abstrait">Arbre syntaxique abstrait</a>). Afin d'obtenir l'AST correspondant au code source analysé, l'équipe s'est intéressée aux parsers JavaScript existants (<a href="ANTLR" title="ANTLR">ANTLR</a><sup id="cite_ref-12" class="reference"><a href="#cite_note-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup>, les combinateurs de parseur de Scala<sup id="cite_ref-13" class="reference"><a href="#cite_note-13"><span class="cite-bracket">[</span>13<span class="cite-bracket">]</span></a></sup>, <a href="Rhino_(moteur_JavaScript)" title="Rhino (moteur JavaScript)">Rhino</a>, <a href="SpiderMonkey" title="SpiderMonkey">SpiderMonkey</a>, Closure Tools<sup id="cite_ref-14" class="reference"><a href="#cite_note-14"><span class="cite-bracket">[</span>14<span class="cite-bracket">]</span></a></sup> de <a href="Google" title="Google">Google</a>, JSConTest<sup id="cite_ref-15" class="reference"><a href="#cite_note-15"><span class="cite-bracket">[</span>15<span class="cite-bracket">]</span></a></sup>, ou encore JSure<sup id="cite_ref-16" class="reference"><a href="#cite_note-16"><span class="cite-bracket">[</span>16<span class="cite-bracket">]</span></a></sup>) sans trouver entière satisfaction. Elle a finalement utilisé l'outil de génération Rats! se trouvant dans le projet eXTensible Compiler<sup id="cite_ref-17" class="reference"><a href="#cite_note-17"><span class="cite-bracket">[</span>17<span class="cite-bracket">]</span></a></sup> développé par une équipe de New York. Elle fournit à Rats! une <a href="Forme_de_Backus-Naur" title="Forme de Backus-Naur">grammaire de style BNF</a> dont voici l'extrait<sup id="cite_ref-18" class="reference"><a href="#cite_note-18"><span class="cite-bracket">[</span>18<span class="cite-bracket">]</span></a></sup> concernant les instructions de boucle (l'indentation représente une relation de sous-classe)&nbsp;:
</p>
<div class="mw-highlight mw-highlight-lang-text mw-content-ltr" dir="ltr"><pre><span></span> /**
* SourceElement&nbsp;::= Stmt
*/
abstract Stmt();
/**
* Stmt&nbsp;::= do Stmt while ( Expr )&nbsp;;
*/
DoWhile(Stmt body, Expr cond);
/**
* Stmt&nbsp;::= while ( Expr ) Stmt
*/
While(Expr cond, Stmt body);
/**
* Stmt&nbsp;::= for ( Expr?&nbsp;; Expr?&nbsp;; Expr? ) Stmt
*/
For(Option&lt;Expr&gt; init, Option&lt;Expr&gt; cond,
Option&lt;Expr&gt; action, Stmt body);
/**
* Stmt&nbsp;::= for ( lhs in Expr ) Stmt
*/
ForIn(LHS lhs, Expr expr, Stmt body);
/**
* Stmt&nbsp;::= for ( var VarDecl(, VarDecl)*&nbsp;;
*
Expr?&nbsp;; Expr? ) Stmt
*/
ForVar(List&lt;VarDecl&gt; vars, Option&lt;Expr&gt; cond,
Option&lt;Expr&gt; action, Stmt body);
/**
* Stmt&nbsp;::= for ( var VarDecl in Expr ) Stmt
*/
ForVarIn(VarDecl var, Expr expr, Stmt body);
</pre></div>
<p>Rats! génère alors un parser JavaScript en langage <a href="Java_(langage)" title="Java (langage)">Java</a>, qui couplé à ASTGen<sup id="cite_ref-19" class="reference"><a href="#cite_note-19"><span class="cite-bracket">[</span>19<span class="cite-bracket">]</span></a></sup>, qui génère les classes Java représentant l'AST à partir d'une description fournie, va permettre de transformer le code JavaScript en représentation intermédiaire.
</p>
<div class="mw-heading mw-heading4"><h4 id="La_représentation_intermédiaire_:_IR"><span id="La_repr.C3.A9sentation_interm.C3.A9diaire_:_IR"></span>La représentation intermédiaire&nbsp;: IR</h4></div>
<p>Dans un second temps, le framework transforme l'AST en une représentation intermédiaire IR qui permet de fournir une spécification de chaque fonctionnalité du langage Javascript définie par ECMAScript. Par exemple, chaque fonction possède au moins l'argument <code>this</code> afin de respecter cette norme. C'est cette représentation qui est utilisée pour l'évaluation du programme par un interpréteur. C'est à ce niveau qu'intervient SAFE en fournissant une spécification formelle et une implémentation de chaque fonctionnalité.
</p><p>Grammaire de JavaScript IR<sup id="cite_ref-20" class="reference"><a href="#cite_note-20"><span class="cite-bracket">[</span>20<span class="cite-bracket">]</span></a></sup>&nbsp;:
</p>
<pre> <span style="text-decoration: underline;">p</span>&nbsp;::= <span style="text-decoration: underline;">s</span><sup>*</sup>
<span style="text-decoration: underline;">s</span>&nbsp;::= <span style="text-decoration: underline;">x</span> = <span style="text-decoration: underline;">e</span>
| <span style="text-decoration: underline;">x</span> = delete <span style="text-decoration: underline;">x</span>
| <span style="text-decoration: underline;">x</span> = delete <span style="text-decoration: underline;">x</span> [<span style="text-decoration: underline;">x</span>]
| <span style="text-decoration: underline;">x</span> = {(m,)<sup>* </sup>}
| <span style="text-decoration: underline;">x</span> = [(e,)<sup>* </sup>]
| <span style="text-decoration: underline;">x</span> = <span style="text-decoration: underline;">x</span>(<span style="text-decoration: underline;">x</span>(, <span style="text-decoration: underline;">x</span>)<sup>?</sup>)
| <span style="text-decoration: underline;">x</span> = new <span style="text-decoration: underline;">x</span>((<span style="text-decoration: underline;">x</span>,)<sup>* </sup>)
| <span style="text-decoration: underline;">x</span> = function <span style="text-decoration: underline;">f</span>(<span style="text-decoration: underline;">x</span>, <span style="text-decoration: underline;">x</span>) { <span style="text-decoration: underline;">s</span><sup>* </sup> }
| function <span style="text-decoration: underline;">f</span>(<span style="text-decoration: underline;">x</span>, <span style="text-decoration: underline;">x</span>) { <span style="text-decoration: underline;">s</span><sup>* </sup> }
| <span style="text-decoration: underline;">x</span> = eval(<span style="text-decoration: underline;">e</span>)
| <span style="text-decoration: underline;">x</span> [<span style="text-decoration: underline;">x</span>] = <span style="text-decoration: underline;">e</span>
| break <span style="text-decoration: underline;">x</span>
| return <span style="text-decoration: underline;">e</span><sup>?</sup>
| with (<span style="text-decoration: underline;">x</span>) <span style="text-decoration: underline;">s</span>
| <span style="text-decoration: underline;">x</span>&nbsp;: { <span style="text-decoration: underline;">s</span> }
| var <span style="text-decoration: underline;">x</span>
| throw <span style="text-decoration: underline;">e</span>
| <span style="text-decoration: underline;">s</span><sup>* </sup>
| if (<span style="text-decoration: underline;">e</span>) then <span style="text-decoration: underline;">s</span> (else <span style="text-decoration: underline;">s</span>)<sup>?</sup>
| while(<span style="text-decoration: underline;">e</span>) <span style="text-decoration: underline;">s</span>
| try { <span style="text-decoration: underline;">s</span> } (catch (<span style="text-decoration: underline;">x</span>){ <span style="text-decoration: underline;">s</span> })<sup>?</sup> (finally { <span style="text-decoration: underline;">s</span> })<sup>?</sup>
| (<span style="text-decoration: underline;">s</span><sup>* </sup>)
<span style="text-decoration: underline;">e</span>&nbsp;::= <span style="text-decoration: underline;">e</span> ⊗ <span style="text-decoration: underline;">e</span>
| ɵ <span style="text-decoration: underline;">e</span>
| <span style="text-decoration: underline;">x</span> [<span style="text-decoration: underline;">e</span>]
| <span style="text-decoration: underline;">x</span>
| this
| <span style="text-decoration: underline;">num</span>
| <span style="text-decoration: underline;">str</span>
| true
| false
| undefined
| null
<span style="text-decoration: underline;">m</span>&nbsp;::= <span style="text-decoration: underline;">x</span>&nbsp;: <span style="text-decoration: underline;">x</span>
| get <span style="text-decoration: underline;">f</span>(<span style="text-decoration: underline;">x</span>, <span style="text-decoration: underline;">x</span>) { <span style="text-decoration: underline;">s</span><sup>* </sup> }
| set <span style="text-decoration: underline;">f</span>(<span style="text-decoration: underline;">x</span>, <span style="text-decoration: underline;">x</span>) { <span style="text-decoration: underline;">s</span><sup>* </sup> }
⊗&nbsp;::= | | &amp; | ^ | &lt;&lt; | &gt;&gt; | &gt;&gt;&gt; | + | - | * | / |&nbsp;% | == |&nbsp;!= | === |&nbsp;!== | &lt; | &gt; | &lt;= | &gt;= | instanceof | in
ɵ&nbsp;::= ~ |&nbsp;! | + | - | void | typeof
</pre>
<div class="mw-heading mw-heading4"><h4 id="Le_graphe_de_flot_de_contrôle_:_CFG"><span id="Le_graphe_de_flot_de_contr.C3.B4le_:_CFG"></span>Le <a href="Graphe_de_flot_de_contr%C3%B4le" title="Graphe de flot de contrôle">graphe de flot de contrôle</a>&nbsp;: CFG</h4></div>
<p>Le troisième niveau de représentation est le CFG (Graphe de flot de contrôle) qui est utilisé uniquement pour l'analyse des performances. Afin de générer ce graphe, le projet utilise CFGBuilder qui est un composant du compilateur Polyglot. Ce programme prend en paramètre une représentation intermédiaire et génère un graphe correspondant qui pourra ensuite être analysé par le framework afin de réaliser plusieurs analyses.
</p><p>Un exemple de transformation du code JavaScript au graphe de contrôle de flot en passant par la représentation intermédiaire, proposé dans le paragraphe 3.3 dans la publication présentant SAFE<sup id="cite_ref-21" class="reference"><a href="#cite_note-21"><span class="cite-bracket">[</span>21<span class="cite-bracket">]</span></a></sup>, illustre bien le résultat obtenu à ce stade.
</p>
<div class="mw-heading mw-heading4"><h4 id="Applications">Applications</h4></div>
<p>Leur framework est disponible au public<sup id="cite_ref-22" class="reference"><a href="#cite_note-22"><span class="cite-bracket">[</span>22<span class="cite-bracket">]</span></a></sup>. Afin de permettre l'utilisation de leur projet par le plus grand nombre, SAFE fournit, en plus de la spécification et d'une documentation fournie, une implémentation des différentes fonctionnalités. Ceci permet d'utiliser leurs recherches plus facilement que les autres projets qui n'ont pas ou peu de documentation.
</p><p>Les 3 niveaux de représentation du code JavaScript (AST, IR, CFG) rendent SAFE plus flexible, évolutif, et connectable, proposant ainsi un outil puissant dans la recherche et le développement de JavaScript.
</p>
<div class="mw-heading mw-heading3"><h3 id="JSCert_:_une_spécification_mécanisée_et_sûre_de_JavaScript[23]"><span id="JSCert_:_une_sp.C3.A9cification_m.C3.A9canis.C3.A9e_et_s.C3.BBre_de_JavaScript.5B23.5D"></span>JSCert&nbsp;: une spécification mécanisée et sûre de JavaScript<sup id="cite_ref-23" class="reference"><a href="#cite_note-23"><span class="cite-bracket">[</span>23<span class="cite-bracket">]</span></a></sup></h3></div>
<p>"Le projet JSCert a pour but de vraiment comprendre JavaScript", annonce le site du projet. Une équipe de chercheurs des laboratoires de l'INRIA et de l'Imperial College London se sont intéressés à la nécessité de clarifier les ambiguïtés liées à la longueur et aux nombreux recoins du standard ECMAScript.
</p>
<div class="mw-heading mw-heading4"><h4 id="JSCert">JSCert</h4></div>
<p>JSCert est une spécification mécanisée du standard ECMAScript, écrite dans l'assistant interactif de preuve <a href="Rocq_(logiciel)" title="Rocq (logiciel)">Rocq</a>, conçue pour être la plus proche de la norme ECMAScript5<sup id="cite_ref-24" class="reference"><a href="#cite_note-24"><span class="cite-bracket">[</span>24<span class="cite-bracket">]</span></a></sup>. Elle se base sur le développement en 2008, mené par Sergio Maffeis, d'une sémantique de description formelle du comportement complet de JavaScript<sup id="cite_ref-25" class="reference"><a href="#cite_note-25"><span class="cite-bracket">[</span>25<span class="cite-bracket">]</span></a></sup> suivant fidèlement ECMAScript3, à l'exception des parties ambiguës de ce standard. Cette formalisation se limite au cœur du langage JavaScript.
</p>
<div class="mw-heading mw-heading4"><h4 id="JSRef">JSRef</h4></div>
<p>En parallèle a été développé JSRef, un interpréteur exécutable de référence, certifié dans le respect de JSCert, et testé en utilisant la suite de tests de confirmité d'ECMAScript, test262<sup id="cite_ref-26" class="reference"><a href="#cite_note-26"><span class="cite-bracket">[</span>26<span class="cite-bracket">]</span></a></sup>.
</p><p>JSCert n'est pas directement utilisable, de par sa conception&nbsp;: c'est une définition inductive à destination du développement de preuves de sûreté, qui compense l'imprécision concernant les fonctionnalités dépendantes de l'implémentation dans ECMAScript5. En tant que spécification Rocq calculable, on en a extrait automatiquement le code <a href="OCaml" title="OCaml">OCaml</a> correspondant, obtenant ainsi l'interpréteur JSRef. Celui-ci respecte la norme ECMAScript5 autant qu'il était possible de la formaliser par JSCert.
</p>
<div class="mw-heading mw-heading4"><h4 id="De_ECMAScript_à_JSRef"><span id="De_ECMAScript_.C3.A0_JSRef"></span>De ECMAScript à JSRef</h4></div>
<p>La vérification de JSCert dans cette sémantique mécanisée est dû à sa proximité avec la norme ECMAScript5&nbsp;: la prose anglaise de celle-ci et les règles formelles qui en découlent peuvent être mises côte-à-côte, chaque ligne de <a href="Pseudo-code" title="Pseudo-code">pseudo-code</a> correspondant à une ou deux règles formelles de JSCert. JSRef se vérifie par le mécanisme automatique par lequel il est extrait de JSCert.
</p><p>Le pseudo-code<sup id="cite_ref-27" class="reference"><a href="#cite_note-27"><span class="cite-bracket">[</span>27<span class="cite-bracket">]</span></a></sup> correspondant à la <a href="Boucle_while" title="Boucle while">boucle while</a> dans ECMAScript5&nbsp;:
</p>
<div class="mw-highlight mw-highlight-lang-text mw-content-ltr" dir="ltr"><pre><span></span> 1. Let V = empty.
2. Repeat
a. Let exprRef be the result of evaluating Expression.
b. If ToBoolean(GetValue(exprRef)) is false, return (normal,V,empty).
c. Let stmt be the result of evaluating Statement.
d. If stmt.value is not empty, let V = stmt.value.
e. If stmt.type is not continue || stmt.target is not in the current label set, then
i. If stmt.type is break and stmt.target is in the current label set, then return (normal,V,empty).
ii. If stmt is an abrupt completion, return stmt.
</pre></div>
<p>La sémantique JSCert implémentée dans Rocq correspondant à la boucle while, et traduisant la sémantique définie dans la publication de JSCert<sup id="cite_ref-28" class="reference"><a href="#cite_note-28"><span class="cite-bracket">[</span>28<span class="cite-bracket">]</span></a></sup>&nbsp;:
</p>
<div class="mw-highlight mw-highlight-lang-ocaml mw-content-ltr" dir="ltr"><pre><span></span> <span class="c">(* Step 1: red_while_1 *)</span>
<span class="o">|</span> <span class="n">red_stat_while</span> <span class="o">:</span> <span class="n">forall</span> <span class="nc">S</span> <span class="nc">C</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">o</span><span class="o">,</span>
<span class="n">red_stat</span> <span class="nc">S</span> <span class="nc">C</span> <span class="o">(</span><span class="n">stat_while_1</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">resvalue_empty</span><span class="o">)</span> <span class="n">o</span> <span class="o">-&gt;</span>
<span class="n">red_stat</span> <span class="nc">S</span> <span class="nc">C</span> <span class="o">(</span><span class="n">stat_while</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span><span class="o">)</span> <span class="n">o</span>

<span class="c">(* Steps 2a and 2b: red_while_2a_2b *)</span>
<span class="o">|</span> <span class="n">red_stat_while_1</span> <span class="o">:</span> <span class="n">forall</span> <span class="nc">S</span> <span class="nc">C</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span> <span class="n">y1</span> <span class="n">o</span><span class="o">,</span>
<span class="n">red_spec</span> <span class="nc">S</span> <span class="nc">C</span> <span class="o">(</span><span class="n">spec_expr_get_value_conv</span> <span class="n">spec_to_boolean</span> <span class="n">e1</span><span class="o">)</span> <span class="n">y1</span> <span class="o">-&gt;</span>
<span class="n">red_stat</span> <span class="nc">S</span> <span class="nc">C</span> <span class="o">(</span><span class="n">stat_while_2</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span> <span class="n">y1</span><span class="o">)</span> <span class="n">o</span> <span class="o">-&gt;</span>
<span class="n">red_stat</span> <span class="nc">S</span> <span class="nc">C</span> <span class="o">(</span><span class="n">stat_while_1</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span><span class="o">)</span> <span class="n">o</span>

<span class="c">(* Step 2b False: red_while_2b'_false *)</span>
<span class="o">|</span> <span class="n">red_stat_while_2_false</span> <span class="o">:</span> <span class="n">forall</span> <span class="nc">S0</span> <span class="nc">S</span> <span class="nc">C</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span><span class="o">,</span>
<span class="n">red_stat</span> <span class="nc">S0</span> <span class="nc">C</span> <span class="o">(</span><span class="n">stat_while_2</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span> <span class="o">(</span><span class="n">vret</span> <span class="nc">S</span> <span class="bp">false</span><span class="o">))</span> <span class="o">(</span><span class="n">out_ter</span> <span class="nc">S</span> <span class="n">rv</span><span class="o">)</span>

<span class="c">(* Step 2b True and 2c: red_while_2b'_true_2c *)</span>
<span class="o">|</span> <span class="n">red_stat_while_2_true</span> <span class="o">:</span> <span class="n">forall</span> <span class="nc">S0</span> <span class="nc">S</span> <span class="nc">C</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span> <span class="n">o1</span> <span class="n">o</span><span class="o">,</span>
<span class="n">red_stat</span> <span class="nc">S</span> <span class="nc">C</span> <span class="n">t2</span> <span class="n">o1</span> <span class="o">-&gt;</span>
<span class="n">red_stat</span> <span class="nc">S</span> <span class="nc">C</span> <span class="o">(</span><span class="n">stat_while_3</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span> <span class="n">o1</span><span class="o">)</span> <span class="n">o</span> <span class="o">-&gt;</span>
<span class="n">red_stat</span> <span class="nc">S0</span> <span class="nc">C</span> <span class="o">(</span><span class="n">stat_while_2</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span> <span class="o">(</span><span class="n">vret</span> <span class="nc">S</span> <span class="bp">true</span><span class="o">))</span> <span class="n">o</span>

<span class="c">(* Step 2d: red_while_2d *)</span>
<span class="o">|</span> <span class="n">red_stat_while_3</span> <span class="o">:</span> <span class="n">forall</span> <span class="n">rv</span> <span class="nc">S0</span> <span class="nc">S</span> <span class="nc">C</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv'</span> <span class="nc">R</span> <span class="n">o</span><span class="o">,</span>
<span class="n">rv'</span> <span class="o">=</span> <span class="o">(</span><span class="nc">If</span> <span class="n">res_value</span> <span class="nc">R</span> <span class="o">&lt;&gt;</span> <span class="n">resvalue_empty</span> <span class="k">then</span> <span class="n">res_value</span> <span class="nc">R</span> <span class="k">else</span> <span class="n">rv</span><span class="o">)</span> <span class="o">-&gt;</span>
<span class="n">red_stat</span> <span class="nc">S</span> <span class="nc">C</span> <span class="o">(</span><span class="n">stat_while_4</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv'</span> <span class="nc">R</span><span class="o">)</span> <span class="n">o</span> <span class="o">-&gt;</span>
<span class="n">red_stat</span> <span class="nc">S0</span> <span class="nc">C</span> <span class="o">(</span><span class="n">stat_while_3</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span> <span class="o">(</span><span class="n">out_ter</span> <span class="nc">S</span> <span class="nc">R</span><span class="o">))</span> <span class="n">o</span>

<span class="c">(* Step 2e False: red_while_2e_false *)</span>
<span class="o">|</span> <span class="n">red_stat_while_4_continue</span> <span class="o">:</span> <span class="n">forall</span> <span class="nc">S</span> <span class="nc">C</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span> <span class="nc">R</span> <span class="n">o</span><span class="o">,</span>
<span class="n">res_type</span> <span class="nc">R</span> <span class="o">=</span> <span class="n">restype_continue</span> <span class="o">/</span><span class="err">\</span> <span class="n">res_label_in</span> <span class="nc">R</span> <span class="n">labs</span> <span class="o">-&gt;</span>
<span class="n">red_stat</span> <span class="nc">S</span> <span class="nc">C</span> <span class="o">(</span><span class="n">stat_while_1</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span><span class="o">)</span> <span class="n">o</span> <span class="o">-&gt;</span>
<span class="n">red_stat</span> <span class="nc">S</span> <span class="nc">C</span> <span class="o">(</span><span class="n">stat_while_4</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span> <span class="nc">R</span><span class="o">)</span> <span class="n">o</span>

<span class="c">(* Step 2e True: red_while_2e_true *)</span>
<span class="o">|</span> <span class="n">red_stat_while_4_not_continue</span> <span class="o">:</span> <span class="n">forall</span> <span class="nc">S</span> <span class="nc">C</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span> <span class="nc">R</span> <span class="n">o</span><span class="o">,</span>
<span class="o">~</span> <span class="o">(</span><span class="n">res_type</span> <span class="nc">R</span> <span class="o">=</span> <span class="n">restype_continue</span> <span class="o">/</span><span class="err">\</span> <span class="n">res_label_in</span> <span class="nc">R</span> <span class="n">labs</span><span class="o">)</span> <span class="o">-&gt;</span>
<span class="n">red_stat</span> <span class="nc">S</span> <span class="nc">C</span> <span class="o">(</span><span class="n">stat_while_5</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span> <span class="nc">R</span><span class="o">)</span> <span class="n">o</span> <span class="o">-&gt;</span>
<span class="n">red_stat</span> <span class="nc">S</span> <span class="nc">C</span> <span class="o">(</span><span class="n">stat_while_4</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span> <span class="nc">R</span><span class="o">)</span> <span class="n">o</span>

<span class="c">(* Step 2e i True: red_while_2e_i_true *)</span>
<span class="o">|</span> <span class="n">red_stat_while_5_break</span> <span class="o">:</span> <span class="n">forall</span> <span class="nc">S</span> <span class="nc">C</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span> <span class="nc">R</span><span class="o">,</span>
<span class="n">res_type</span> <span class="nc">R</span> <span class="o">=</span> <span class="n">restype_break</span> <span class="o">/</span><span class="err">\</span> <span class="n">res_label_in</span> <span class="nc">R</span> <span class="n">labs</span> <span class="o">-&gt;</span>
<span class="n">red_stat</span> <span class="nc">S</span> <span class="nc">C</span> <span class="o">(</span><span class="n">stat_while_5</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span> <span class="nc">R</span><span class="o">)</span> <span class="o">(</span><span class="n">out_ter</span> <span class="nc">S</span> <span class="n">rv</span><span class="o">)</span>

<span class="c">(* Step 2e i False: red_while_2e_i_false *)</span>
<span class="o">|</span> <span class="n">red_stat_while_5_not_break</span> <span class="o">:</span> <span class="n">forall</span> <span class="nc">S</span> <span class="nc">C</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span> <span class="nc">R</span> <span class="n">o</span><span class="o">,</span>
<span class="o">~</span> <span class="o">(</span><span class="n">res_type</span> <span class="nc">R</span> <span class="o">=</span> <span class="n">restype_break</span> <span class="o">/</span><span class="err">\</span> <span class="n">res_label_in</span> <span class="nc">R</span> <span class="n">labs</span><span class="o">)</span> <span class="o">-&gt;</span>
<span class="n">red_stat</span> <span class="nc">S</span> <span class="nc">C</span> <span class="o">(</span><span class="n">stat_while_6</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span> <span class="nc">R</span><span class="o">)</span> <span class="n">o</span> <span class="o">-&gt;</span>
<span class="n">red_stat</span> <span class="nc">S</span> <span class="nc">C</span> <span class="o">(</span><span class="n">stat_while_5</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span> <span class="nc">R</span><span class="o">)</span> <span class="n">o</span>

<span class="c">(* Step 2e ii True: red_while_2e_ii_true *)</span>
<span class="o">|</span> <span class="n">red_stat_while_6_abort</span> <span class="o">:</span> <span class="n">forall</span> <span class="nc">S</span> <span class="nc">C</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span> <span class="nc">R</span><span class="o">,</span>
<span class="n">res_type</span> <span class="nc">R</span> <span class="o">&lt;&gt;</span> <span class="n">restype_normal</span> <span class="o">-&gt;</span>
<span class="n">red_stat</span> <span class="nc">S</span> <span class="nc">C</span> <span class="o">(</span><span class="n">stat_while_6</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span> <span class="nc">R</span><span class="o">)</span> <span class="o">(</span><span class="n">out_ter</span> <span class="nc">S</span> <span class="nc">R</span><span class="o">)</span>

<span class="c">(* Step 2e ii False: red_while_2e_ii_false *)</span>
<span class="o">|</span> <span class="n">red_stat_while_6_normal</span> <span class="o">:</span> <span class="n">forall</span> <span class="nc">S</span> <span class="nc">C</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span> <span class="nc">R</span> <span class="n">o</span><span class="o">,</span>
<span class="n">res_type</span> <span class="nc">R</span> <span class="o">=</span> <span class="n">restype_normal</span> <span class="o">-&gt;</span>
<span class="n">red_stat</span> <span class="nc">S</span> <span class="nc">C</span> <span class="o">(</span><span class="n">stat_while_1</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span><span class="o">)</span> <span class="n">o</span> <span class="o">-&gt;</span>
<span class="n">red_stat</span> <span class="nc">S</span> <span class="nc">C</span> <span class="o">(</span><span class="n">stat_while_6</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">rv</span> <span class="nc">R</span><span class="o">)</span> <span class="n">o</span>
</pre></div>
<p>La sémantique JSRef de la boucle while<sup id="cite_ref-29" class="reference"><a href="#cite_note-29"><span class="cite-bracket">[</span>29<span class="cite-bracket">]</span></a></sup>&nbsp;:
</p>
<div class="mw-highlight mw-highlight-lang-ocaml mw-content-ltr" dir="ltr"><pre><span></span><span class="nc">Definition</span> <span class="n">run_stat_while</span> <span class="n">runs</span> <span class="nc">S</span> <span class="nc">C</span> <span class="n">rv</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="o">:</span> <span class="n">result</span> <span class="o">:=</span>
<span class="n">if_spec</span> <span class="o">(</span><span class="n">run_expr_get_value</span> <span class="n">runs</span> <span class="nc">S</span> <span class="nc">C</span> <span class="n">e1</span><span class="o">)</span> <span class="o">(</span><span class="k">fun</span> <span class="nc">S1</span> <span class="n">v1</span> <span class="o">=&gt;</span>
<span class="nc">Let</span> <span class="n">b</span> <span class="o">:=</span> <span class="n">convert_value_to_boolean</span> <span class="n">v1</span> <span class="k">in</span>
<span class="k">if</span> <span class="n">b</span> <span class="k">then</span>
<span class="n">if_ter</span> <span class="o">(</span><span class="n">runs</span><span class="o">.</span><span class="n">runs_type_stat</span> <span class="nc">S1</span> <span class="nc">C</span> <span class="n">t2</span><span class="o">)</span> <span class="o">(</span><span class="k">fun</span> <span class="nc">S2</span> <span class="nc">R</span> <span class="o">=&gt;</span>
<span class="nc">Let</span> <span class="n">rv'</span> <span class="o">:=</span> <span class="n">ifb</span> <span class="n">res_value</span> <span class="nc">R</span> <span class="o">!=</span> <span class="n">resvalue_empty</span>
<span class="k">then</span> <span class="n">res_value</span> <span class="nc">R</span> <span class="k">else</span> <span class="n">rv</span> <span class="k">in</span>
<span class="nc">Let</span> <span class="n">loop</span> <span class="o">:=</span> <span class="k">fun</span> <span class="o">_</span> <span class="o">=&gt;</span> <span class="n">runs</span><span class="o">.</span><span class="n">runs_type_stat_while</span> <span class="nc">S2</span> <span class="nc">C</span> <span class="n">rv'</span> <span class="n">labs</span> <span class="n">e1</span> <span class="n">t2</span> <span class="k">in</span>
<span class="n">ifb</span> <span class="n">res_type</span> <span class="nc">R</span> <span class="o">!=</span> <span class="n">restype_continue</span>
<span class="o">||</span> <span class="n">res_label_in</span> <span class="nc">R</span> <span class="n">labs</span>
<span class="k">then</span> <span class="o">(</span><span class="n">ifb</span> <span class="n">res_type</span> <span class="nc">R</span> <span class="o">=</span> <span class="n">restype_break</span>
<span class="o">&amp;&amp;</span> <span class="n">res_label_in</span> <span class="nc">R</span> <span class="n">labs</span>
<span class="k">then</span> <span class="n">res_ter</span> <span class="nc">S2</span> <span class="n">rv'</span>
<span class="k">else</span> <span class="o">(</span><span class="n">ifb</span> <span class="n">res_type</span> <span class="nc">R</span> <span class="o">!=</span> <span class="n">restype_normal</span>
<span class="k">then</span> <span class="n">res_ter</span> <span class="nc">S2</span> <span class="nc">R</span> <span class="k">else</span> <span class="n">loop</span> <span class="n">tt</span><span class="o">))</span>
<span class="k">else</span> <span class="n">loop</span> <span class="n">tt</span><span class="o">)</span>
<span class="k">else</span> <span class="n">res_ter</span> <span class="nc">S1</span> <span class="n">rv</span><span class="o">).</span>

<span class="nc">Definition</span> <span class="n">run_stat</span> <span class="n">runs</span> <span class="nc">S</span> <span class="nc">C</span> <span class="n">t</span> <span class="o">:</span> <span class="n">result</span> <span class="o">:=</span>
<span class="k">match</span> <span class="n">t</span> <span class="k">with</span>
<span class="o">|</span><span class="n">stat_while</span> <span class="n">ls</span> <span class="n">e1</span> <span class="n">t2</span> <span class="o">=&gt;</span> <span class="n">runs</span><span class="o">.</span><span class="n">runs_type_stat_while</span> <span class="nc">S</span> <span class="nc">C</span> <span class="n">ls</span> <span class="n">e1</span> <span class="n">t2</span> <span class="n">resvalue_empt</span><span class="o">...</span>
</pre></div>
<div class="mw-heading mw-heading4"><h4 id="Applications_2">Applications</h4></div>
<p>On peut envisager plusieurs utilisations potentielles de JSCert et JSRef&nbsp;:
</p>
<ul><li>analyser des morceaux de code JavaScript</li>
<li>vérifier la bonne implémentation d'un compilateur d'un langage de plus haut niveau en JavaScript</li>
<li>comparer l'implémentation d'un interpréteur avec celle de JSRef</li></ul>
<p>On peut imaginer que cette spécification formelle et mécanisée soit intégrée dans une future édition d'ECMAScript.
</p>
<div class="mw-heading mw-heading2"><h2 id="Synthèse"><span id="Synth.C3.A8se"></span>Synthèse</h2></div>
<table class="wikitable">
<tbody><tr>
<th>
</th>
<th>λJS
</th>
<th>SAFE
</th>
<th>JSCert
</th></tr>
<tr>
<td>Motivation
</td>
<td>Pouvoir tester plus efficacement des programmes
<p>Diminuer la complexité des programmes
</p>
</td>
<td>Améliorer l'analyse des programmes
<p>Fournir des outils pour la recherche
</p>
</td>
<td>Fournir une représentation formelle de l'ECMASCRIPT
<p>Clarifier ECMAScript en cas de doute sur l'interprétation
</p><p>Fournir un interpréteur vérifiant qu'un programme respecte cette spécification
</p>
</td></tr>
<tr>
<td>Réalisations
</td>
<td>Réalisation d'un noyau minimal de Javascript
<p>Assurer la sureté de ce noyau
</p><p>Ramener le sucre syntaxique aux fonctions de base
</p>
</td>
<td>Fournir une spécification et une implémentation de l'ECMAScript
<p>Convertir l'AST d'un programme Javascript vers une représentation intermédiaire
</p>
</td>
<td>Réalisation d'une spécification formelle des fonctionnalités de Javascript
<p>Réalisation d'un interpréteur respectant JSCert
</p>
</td></tr>
<tr>
<td>Spécification
<p>effectuée
</p>
</td>
<td>Réduction du Javascript en un ensemble de fonction minimale
</td>
<td>Spécification sur chaque niveau de représentation d'un programme Javascript
</td>
<td>Réalisation d'une spécification en Rocq
</td></tr></tbody></table>
<div class="mw-heading mw-heading2"><h2 id="Liens_externes">Liens externes</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Notes_et_références"><span id="Notes_et_r.C3.A9f.C3.A9rences"></span>Notes et références</h3></div>
<div class="references-small decimal" style="column-width:24em; column-count:3;"><ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a> </span><span class="reference-text"><span class="ouvrage" id="Descombes2002"><span class="ouvrage" id="Serge_Descombes2002">Serge Descombes, «&nbsp;<a rel="nofollow" class="external text" href="http://www.journaldunet.com/developpeur/tutoriel/dht/020911_dom.shtml"><cite style="font-style:normal;">Le Journal du Net - Petit guide de compatibilité des navigateurs web</cite></a>&nbsp;», <time class="nowrap" datetime="2002-09-11" data-sort-value="2002-09-11">11 septembre 2002</time> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2014-12-02" data-sort-value="2014-12-02">2 décembre 2014</time>)</small></span></span>.</span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a> </span><span class="reference-text"><span class="ouvrage" id="2012"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="https://www.w3.org/community/webed/wiki/A_Short_History_of_JavaScript"><cite style="font-style:normal;" lang="en">A Short History of JavaScript</cite></a>&nbsp;», <time class="nowrap" datetime="2012-06" data-sort-value="2012-06">juin 2012</time> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2014-12-09" data-sort-value="2014-12-09">9 décembre 2014</time>)</small></span>.</span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><a href="#cite_ref-3">↑</a> </span><span class="reference-text"><span class="ouvrage" id="2011"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.4.3"><cite style="font-style:normal;" lang="en">ECMAScript language specification - The typeof Operator</cite></a>&nbsp;», <time class="nowrap" datetime="2011-06" data-sort-value="2011-06">juin 2011</time> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2014-12-02" data-sort-value="2014-12-02">2 décembre 2014</time>)</small></span>.</span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><a href="#cite_ref-4">↑</a> </span><span class="reference-text"><span class="ouvrage" id="2008"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="http://orangoo.com/labs/AJS/"><cite style="font-style:normal;" lang="en">The ultra lightweight JavaScript library</cite></a>&nbsp;», sur <span class="italique">orangoo.com</span>, <time class="nowrap" datetime="2008-06-21" data-sort-value="2008-06-21">21 juin 2008</time> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2015-01-07" data-sort-value="2015-01-07">7 janvier 2015</time>)</small></span>.</span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><a href="#cite_ref-5">↑</a> </span><span class="reference-text"><a href="#λJS">Guha, Saftoiu et Krishnamurthi 2010</a></span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><a href="#cite_ref-6">↑</a> </span><span class="reference-text"><span class="ouvrage" id="2014"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="https://developer.mozilla.org/en-US/docs/Mozilla/QA/Automated_testing"><cite style="font-style:normal;" lang="en">Mozilla automated testing</cite></a>&nbsp;», sur <span class="italique">developer.mozilla.org</span>, <time class="nowrap" datetime="2014-09-08" data-sort-value="2014-09-08">8 septembre 2014</time> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2014-12-14" data-sort-value="2014-12-14">14 décembre 2014</time>)</small></span>.</span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><a href="#cite_ref-7">↑</a> </span><span class="reference-text"><span class="ouvrage" id="2012"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="http://blog.brownplt.org/2012/04/01/ecma-lambdajs-announcement.html"><cite style="font-style:normal;" lang="en">ECMA Announces Official λJS Adoption</cite></a>&nbsp;», sur <span class="italique">blog.brownplt.org</span>,‎ <time class="nowrap" datetime="2012-04-01" data-sort-value="2012-04-01"><abbr class="abbr" title="premier">1<sup>er</sup></abbr> avril 2012</time> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2014-12-14" data-sort-value="2014-12-14">14 décembre 2014</time>)</small></span>.</span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><a href="#cite_ref-8">↑</a> </span><span class="reference-text"><span class="ouvrage"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="https://kangax.github.io/compat-table/es6/"><cite style="font-style:normal;" lang="en">ECMASCRIPT compatibility table</cite></a>&nbsp;», sur <span class="italique">kangax.github.io</span> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2015-01-07" data-sort-value="2015-01-07">7 janvier 2015</time>)</small></span>.</span>
</li>
<li id="cite_note-9"><span class="mw-cite-backlink"><a href="#cite_ref-9">↑</a> </span><span class="reference-text"><a href="#Safe">Lee <i><abbr class="abbr" title="et alii (« et d’autres »)" lang="la">et al.</abbr></i> 2012</a></span>
</li>
<li id="cite_note-10"><span class="mw-cite-backlink"><a href="#cite_ref-10">↑</a> </span><span class="reference-text"><span class="ouvrage"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="http://plrg.kaist.ac.kr/research/safe"><cite style="font-style:normal;" lang="en">KAIST</cite></a>&nbsp;», sur <span class="italique">plrg.kaist.ac.kr</span> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2014-12-15" data-sort-value="2014-12-15">15 décembre 2014</time>)</small></span>.</span>
</li>
<li id="cite_note-11"><span class="mw-cite-backlink"><a href="#cite_ref-11">↑</a> </span><span class="reference-text"><span class="ouvrage"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="http://plrg.kaist.ac.kr/redmine/projects/jsf/repository"><cite style="font-style:normal;" lang="en">KAIST source code</cite></a>&nbsp;», sur <span class="italique">plrg.kaist.ac.kr</span> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2014-12-15" data-sort-value="2014-12-15">15 décembre 2014</time>)</small></span>.</span>
</li>
<li id="cite_note-12"><span class="mw-cite-backlink"><a href="#cite_ref-12">↑</a> </span><span class="reference-text"><span class="ouvrage"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="http://www.antlr.org/"><cite style="font-style:normal;" lang="en">ANTLR</cite></a>&nbsp;» <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2014-12-16" data-sort-value="2014-12-16">16 décembre 2014</time>)</small></span>.</span>
</li>
<li id="cite_note-13"><span class="mw-cite-backlink"><a href="#cite_ref-13">↑</a> </span><span class="reference-text"><span class="ouvrage"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="http://www.scala-lang.org/api/2.10.2/index.html#scala.util.parsing.combinator.Parsers"><cite style="font-style:normal;" lang="en">Scala's parser combinators documentation</cite></a>&nbsp;», sur <span class="italique">scala-lang.org</span> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2014-12-16" data-sort-value="2014-12-16">16 décembre 2014</time>)</small></span>.</span>
</li>
<li id="cite_note-14"><span class="mw-cite-backlink"><a href="#cite_ref-14">↑</a> </span><span class="reference-text"><span class="ouvrage"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="https://developers.google.com/closure"><cite style="font-style:normal;" lang="en">Closure Tools</cite></a>&nbsp;», sur <span class="italique">developers.google.com</span> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2014-12-16" data-sort-value="2014-12-16">16 décembre 2014</time>)</small></span>.</span>
</li>
<li id="cite_note-15"><span class="mw-cite-backlink"><a href="#cite_ref-15">↑</a> </span><span class="reference-text"><span class="ouvrage"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="https://github.com/heidegger/JSConTest"><cite style="font-style:normal;" lang="en">JSConTest</cite></a>&nbsp;», sur <span class="italique">github.com</span> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2014-12-16" data-sort-value="2014-12-16">16 décembre 2014</time>)</small></span>.</span>
</li>
<li id="cite_note-16"><span class="mw-cite-backlink"><a href="#cite_ref-16">↑</a> </span><span class="reference-text"><span class="ouvrage"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="https://github.com/berke/jsure"><cite style="font-style:normal;" lang="en">JSure</cite></a>&nbsp;», sur <span class="italique">github.com</span> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2014-12-16" data-sort-value="2014-12-16">16 décembre 2014</time>)</small></span>.</span>
</li>
<li id="cite_note-17"><span class="mw-cite-backlink"><a href="#cite_ref-17">↑</a> </span><span class="reference-text"><span class="ouvrage" id="2014"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="http://cs.nyu.edu/rgrimm/xtc/"><cite style="font-style:normal;" lang="en">XTC</cite></a>&nbsp;», sur <span class="italique">cs.nyu.edu</span>, <time class="nowrap" datetime="2014-08-17" data-sort-value="2014-08-17">17 août 2014</time> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2014-12-15" data-sort-value="2014-12-15">15 décembre 2014</time>)</small></span>.</span>
</li>
<li id="cite_note-18"><span class="mw-cite-backlink"><a href="#cite_ref-18">↑</a> </span><span class="reference-text"><a href="#Safe">Lee <i><abbr class="abbr" title="et alii (« et d’autres »)" lang="la">et al.</abbr></i> 2012</a>, Fig. 9, <abbr class="abbr" title="page(s)">p.</abbr>&nbsp;7</span>
</li>
<li id="cite_note-19"><span class="mw-cite-backlink"><a href="#cite_ref-19">↑</a> </span><span class="reference-text"><span class="ouvrage"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="http://sourceforge.net/projects/astgen/"><cite style="font-style:normal;" lang="en">ASTGen</cite></a>&nbsp;», sur <span class="italique">sourceforge.net</span> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2014-12-16" data-sort-value="2014-12-16">16 décembre 2014</time>)</small></span>.</span>
</li>
<li id="cite_note-20"><span class="mw-cite-backlink"><a href="#cite_ref-20">↑</a> </span><span class="reference-text"><a href="#Safe">Lee <i><abbr class="abbr" title="et alii (« et d’autres »)" lang="la">et al.</abbr></i> 2012</a>, Fig. 4, <abbr class="abbr" title="page(s)">p.</abbr>&nbsp;4</span>
</li>
<li id="cite_note-21"><span class="mw-cite-backlink"><a href="#cite_ref-21">↑</a> </span><span class="reference-text"><a href="#Safe">Lee <i><abbr class="abbr" title="et alii (« et d’autres »)" lang="la">et al.</abbr></i> 2012</a>, § 3.3, <abbr class="abbr" title="page(s)">p.</abbr>&nbsp;5 &amp; 7</span>
</li>
<li id="cite_note-22"><span class="mw-cite-backlink"><a href="#cite_ref-22">↑</a> </span><span class="reference-text"><span class="ouvrage" id="2014"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="https://github.com/sukyoung/safe"><cite style="font-style:normal;" lang="en">SAFE Github</cite></a>&nbsp;», sur <span class="italique">github.com</span>, <time class="nowrap" datetime="2014-09-21" data-sort-value="2014-09-21">21 septembre 2014</time> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2014-12-14" data-sort-value="2014-12-14">14 décembre 2014</time>)</small></span>.</span>
</li>
<li id="cite_note-23"><span class="mw-cite-backlink"><a href="#cite_ref-23">↑</a> </span><span class="reference-text"><a href="#JSCert_ref">Bodin <i><abbr class="abbr" title="et alii (« et d’autres »)" lang="la">et al.</abbr></i> 2014</a>, <abbr class="abbr" title="page(s)">p.</abbr>&nbsp;87-100</span>
</li>
<li id="cite_note-24"><span class="mw-cite-backlink"><a href="#cite_ref-24">↑</a> </span><span class="reference-text"><span class="ouvrage"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="http://www.ecma-international.org/ecma-262/5.1/"><cite style="font-style:normal;" lang="en">Standard ECMA-262</cite></a>&nbsp;», sur <span class="italique">ecma-international.org</span> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2015-01-07" data-sort-value="2015-01-07">7 janvier 2015</time>)</small></span>.</span>
</li>
<li id="cite_note-25"><span class="mw-cite-backlink"><a href="#cite_ref-25">↑</a> </span><span class="reference-text"><span class="ouvrage" id="2008"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="http://jssec.net/semantics/"><cite style="font-style:normal;" lang="en">An Operational Semantics for JavaScript</cite></a>&nbsp;», <time>2008</time> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2014-12-15" data-sort-value="2014-12-15">15 décembre 2014</time>)</small></span>,<a href="#OperationalSemantics">Maffeis, Mitchell et Taly 2008</a>, <abbr class="abbr" title="page(s)">p.</abbr>&nbsp;307-325.</span>
</li>
<li id="cite_note-26"><span class="mw-cite-backlink"><a href="#cite_ref-26">↑</a> </span><span class="reference-text"><span class="ouvrage"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="http://test262.ecmascript.org/"><cite style="font-style:normal;" lang="en">ECMAScript Language test262</cite></a>&nbsp;» <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2014-12-15" data-sort-value="2014-12-15">15 décembre 2014</time>)</small></span>.</span>
</li>
<li id="cite_note-27"><span class="mw-cite-backlink"><a href="#cite_ref-27">↑</a> </span><span class="reference-text"><a href="#JSCert_ref">Bodin <i><abbr class="abbr" title="et alii (« et d’autres »)" lang="la">et al.</abbr></i> 2014</a>, Fig. 1, <abbr class="abbr" title="page(s)">p.</abbr>&nbsp;91</span>
</li>
<li id="cite_note-28"><span class="mw-cite-backlink"><a href="#cite_ref-28">↑</a> </span><span class="reference-text"><a href="#JSCert_ref">Bodin <i><abbr class="abbr" title="et alii (« et d’autres »)" lang="la">et al.</abbr></i> 2014</a>, Fig. 3, <abbr class="abbr" title="page(s)">p.</abbr>&nbsp;94</span>
</li>
<li id="cite_note-29"><span class="mw-cite-backlink"><a href="#cite_ref-29">↑</a> </span><span class="reference-text"><a href="#JSCert_ref">Bodin <i><abbr class="abbr" title="et alii (« et d’autres »)" lang="la">et al.</abbr></i> 2014</a>, Fig. 5, <abbr class="abbr" title="page(s)">p.</abbr>&nbsp;96</span>
</li>
</ol>
</div>
<div class="mw-heading mw-heading3"><h3 id="Bibliographie">Bibliographie</h3></div>
<p><span class="ouvrage" id="λJS"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Arjun <span class="nom_auteur">Guha</span>, Claudiu <span class="nom_auteur">Saftoiu</span> et Shriram <span class="nom_auteur">Krishnamurthi</span>, «&nbsp;<cite style="font-style:normal" lang="en">The Essence of JavaScript</cite>&nbsp;», <i><span class="lang-en" lang="en">ECOOP '10 Proceedings of the 24th European conference on Object-oriented programming</span></i>,‎ <time class="nowrap" datetime="2010-06-21" data-sort-value="2010-06-21">21 juin 2010</time>, <abbr class="abbr" title="pages">p.</abbr>&nbsp;<span class="nowrap">126-150</span> <small style="line-height:1em;">(<a href="International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<span class="nowrap">3-642-14106-4</span> et <span class="nowrap">978-3-642-14106-5</span>, <a rel="nofollow" class="external text" href="https://cs.brown.edu/~sk/Publications/Papers/Published/gsk-essence-javascript/paper.pdf">lire en ligne</a>)</small><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=article&amp;rft.atitle=The+Essence+of+JavaScript&amp;rft.jtitle=ECOOP+%2710+Proceedings+of+the+24th+European+conference+on+Object-oriented+programming&amp;rft.aulast=Guha&amp;rft.aufirst=Arjun&amp;rft.au=Saftoiu%2C+Claudiu&amp;rft.au=Krishnamurthi%2C+Shriram&amp;rft.date=2010-06-21&amp;rft.pages=126-150&amp;rft.isbn=3-642-14106-4&amp;rft_id=https%3A%2F%2Fcs.brown.edu%2F~sk%2FPublications%2FPapers%2FPublished%2Fgsk-essence-javascript%2Fpaper.pdf&amp;rfr_id=info%3Asid%2Ffr.wikipedia.org%3ASp%C3%A9cification+de+JavaScript"></span></span></p><div style="margin-left:2em; line-height:1.5;">Brown University</div>
<p><span class="ouvrage" id="Safe"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Hongki <span class="nom_auteur">Lee</span>, Sooncheol <span class="nom_auteur">Won</span>, Joonho <span class="nom_auteur">Jin</span>, Junhee <span class="nom_auteur">Cho</span> et Sukyoung <span class="nom_auteur">Ryu</span>, «&nbsp;<cite style="font-style:normal" lang="en">SAFE: Formal Specification and Implementation of a Scalable Analysis Framework for ECMAScript</cite>&nbsp;», <i><span class="lang-en" lang="en">FOOL '12 Foundations of Object-Oriented Languages</span></i>,‎ <time class="nowrap" datetime="2012-10-22" data-sort-value="2012-10-22">22 octobre 2012</time> <small style="line-height:1em;">(<a href="CiteSeerX" title="CiteSeerX">CiteSeer<sup>x</sup></a>&nbsp;<span class=" noarchive nowrap"><a rel="nofollow" class="external text" href="https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.387.1030">10.1.1.387.1030</a></span>, <a rel="nofollow" class="external text" href="http://www.cs.uwm.edu/~boyland/fool2012/papers/fool2012_submission_5.pdf">lire en ligne</a>)</small><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=article&amp;rft.atitle=SAFE%3A+Formal+Specification+and+Implementation+of+a+Scalable+Analysis+Framework+for+ECMAScript&amp;rft.jtitle=FOOL+%2712+Foundations+of+Object-Oriented+Languages&amp;rft.aulast=Lee&amp;rft.aufirst=Hongki&amp;rft.au=Won%2C+Sooncheol&amp;rft.au=Jin%2C+Joonho&amp;rft.au=Cho%2C+Junhee&amp;rft.au=Ryu%2C+Sukyoung&amp;rft.date=2012-10-22&amp;rft_id=http%3A%2F%2Fwww.cs.uwm.edu%2F~boyland%2Ffool2012%2Fpapers%2Ffool2012_submission_5.pdf&amp;rfr_id=info%3Asid%2Ffr.wikipedia.org%3ASp%C3%A9cification+de+JavaScript"></span></span></p><div style="margin-left:2em; line-height:1.5;">KAIST</div>
<p><span class="ouvrage" id="JSCert_ref"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Martin <span class="nom_auteur">Bodin</span>, Arthur <span class="nom_auteur">Charguéraud</span>, Daniele <span class="nom_auteur">Filaretti</span>, Philippa <span class="nom_auteur">Gardner</span>, Sergio <span class="nom_auteur">Maffeis</span>, Daiva <span class="nom_auteur">Naudžiuniene</span>, Alan <span class="nom_auteur">Schmitt</span> et Gareth <span class="nom_auteur">Smith</span>, «&nbsp;<cite style="font-style:normal" lang="en">A Trusted Mechanised JavaScript Specification</cite>&nbsp;», <i><span class="lang-en" lang="en">POPL '14 Proceedings of the 41st ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</span></i>,‎ <time class="nowrap" datetime="2014-01-22" data-sort-value="2014-01-22">22 janvier 2014</time> <small style="line-height:1em;">(<a href="International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<span class="nowrap">978-1-4503-2544-8</span>, <a href="Digital_Object_Identifier" title="Digital Object Identifier">DOI</a>&nbsp;<span class=" noarchive nowrap"><a rel="nofollow" class="external text" href="https://dx.doi.org/10.1145/2535838.2535876">10.1145/2535838.2535876</a></span>, <a rel="nofollow" class="external text" href="http://www.doc.ic.ac.uk/~gds/jscert_popl14.pdf">lire en ligne</a>)</small><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=article&amp;rft.atitle=A+Trusted+Mechanised+JavaScript+Specification&amp;rft.jtitle=POPL+%2714+Proceedings+of+the+41st+ACM+SIGPLAN-SIGACT+Symposium+on+Principles+of+Programming+Languages&amp;rft.aulast=Bodin&amp;rft.aufirst=Martin&amp;rft.au=Chargu%C3%A9raud%2C+Arthur&amp;rft.au=Filaretti%2C+Daniele&amp;rft.au=Gardner%2C+Philippa&amp;rft.au=Maffeis%2C+Sergio&amp;rft.au=Naud%C5%BEiuniene%2C+Daiva&amp;rft.au=Schmitt%2C+Alan&amp;rft.au=Smith%2C+Gareth&amp;rft.date=2014-01-22&amp;rft.isbn=978-1-4503-2544-8&amp;rft_id=info%3Adoi%2F10.1145%2F2535838.2535876&amp;rft_id=http%3A%2F%2Fwww.doc.ic.ac.uk%2F~gds%2Fjscert_popl14.pdf&amp;rfr_id=info%3Asid%2Ffr.wikipedia.org%3ASp%C3%A9cification+de+JavaScript"></span></span></p><div style="margin-left:2em; line-height:1.5;">INRIA &amp; Imperial College London</div>
<p><span class="ouvrage" id="OperationalSemantics"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Sergio <span class="nom_auteur">Maffeis</span>, John C. <span class="nom_auteur">Michell</span> et Ankur <span class="nom_auteur">Taly</span>, «&nbsp;<cite style="font-style:normal" lang="en">An Operational Semantics for JavaScript</cite>&nbsp;», <i><span class="lang-en" lang="en">APLAS '08</span></i>,‎ <time>2008</time> <small style="line-height:1em;">(<a rel="nofollow" class="external text" href="http://www-cs-students.stanford.edu/~ataly/Papers/aplas08.pdf">lire en ligne</a>)</small><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=article&amp;rft.atitle=An+Operational+Semantics+for+JavaScript&amp;rft.jtitle=APLAS+%2708&amp;rft.aulast=Maffeis&amp;rft.aufirst=Sergio&amp;rft.au=Michell%2C+John+C.&amp;rft.au=Taly%2C+Ankur&amp;rft.date=2008&amp;rft_id=http%3A%2F%2Fwww-cs-students.stanford.edu%2F~ataly%2FPapers%2Faplas08.pdf&amp;rfr_id=info%3Asid%2Ffr.wikipedia.org%3ASp%C3%A9cification+de+JavaScript"></span></span>
</p>
<div class="mw-heading mw-heading3"><h3 id="Articles_connexes">Articles connexes</h3></div>
<ul><li><a href="JavaScript" title="JavaScript">JavaScript</a></li>
<li><a href="ECMAScript" title="ECMAScript">ECMAScript</a></li></ul>
<ul id="bandeau-portail" class="bandeau-portail"><li><span class="bandeau-portail-element"><span class="bandeau-portail-icone"><span class="noviewer" typeof="mw:File"></span></span> <span class="bandeau-portail-texte">Portail de la programmation informatique</span> </span></li> </ul></div><!--htdig_noindex--><div><div class="zim-footer">
Cet article est issu de <a class="external text" title="Dernière modification le 2025-03-15" href="https://fr.wikipedia.org/wiki/?title=Sp%C3%A9cification_de_JavaScript&amp;oldid=223921674">Wikipédia</a>. Sauf mention contraire, le texte est disponible sous <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.fr">Creative Commons Attribution-Share Alike 4.0</a>. Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>